# 之前用过 __init__() 初始化方法
# 所有在创建对象的时候，都需要传入实例属性

# str魔术方法:在对象被打印时自动触发,可以用来定义对象被打印时的输出信息
"""
class People:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        return "<name:%s ages:%s>"%(self.name,self.age)
    def run(self):
        return self.name
# 通过People创建p1对象
p1 = People("张鑫",199)
print(p1)
"""
"""
如果没有__str__方法，直接打印会是地址值：
<__main__.People object at 0x000001F7D58A1220>

有__str__方法，会打印str方法里面的定义内容
"""
# del魔术方法：在对象被删除时先自动触发该方法，可以用来回收对象以外其他相关资源
"""
class Foo:
    def __init__(self,x,filepath,encoding='utf-8'):
        self.x = x
        self.f = open(filepath,'r',encoding=encoding)
    def __del__(self):
        print("__del__正在运行")
        self.f.close()
    def read(self):
        return self.f.read()
# 通过Foo创建f1对象
f1 = Foo(1,'1.txt')
print(f1.read())
print(f1.read())
print(f1.read())
print(f1.read())
"""
"""
当后续代码块没有再调用的时候，会执行del方法
回收资源
"""

# call魔术方法：在对象被调用时会自动触发该方法
class Foo:
    def __init__(self,name,age):
        self.name= name
        self.age = age
    def __call__(self, *args, **kwargs):
        print(args)
        print(kwargs)
        """
        (11,22,33,[11,1,1,1,1,1],("张鑫","张鑫2号","张鑫暗号"),{"张鑫":"姓名"})
        {"name":'张鑫'}
        """
    def run(self):
        print("run")
# 根据Foo创建f1对象
f1 = Foo("张三",19)
# f1.run()
# 走到call方法
f1(11,22,33,[11,1,1,1,1,1],("张鑫","张鑫2号","张鑫暗号"),{"张鑫":"姓名"},name='张鑫')




